package com.ssm.test.proxytest;

import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
import java.lang.reflect.Method;

public class CgLibProxy implements MethodInterceptor {
    /**
     * 生成CGLib代理对象
     * @param cls 被代理的类
     * 返回代理对象
     * */
    public Object getProxyInstance(Class cls){
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(cls);//把被代理的类设置为父类，可以理解Enhancer类继承了被代理的类
        enhancer.setCallback(this);//设置回调接口MethodInterceptor，由于CgLibProxy实现了该接口，所以传this
        return enhancer.create();
    }
    /**
     * @param o 代理对象
     * @param method 方法
     * @param args   方法参数
     * @param methodProxy 方法代理
     * **/
    @Override
    public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {
        before();
        Object object = methodProxy.invokeSuper(o,args);//调用真实对象的方法，可以简单理解为上面的Enhancer调用父类的方法
        after();
        return object;
    }
    public void before(){
        System.out.println("代理前置增强");
    }
    public void after(){
        System.out.println("代理后置增强");
    }

    public static void main(String[] args) {
        CgLibProxy cgLibProxy = new CgLibProxy();
        Hello hello = (Hello) cgLibProxy.getProxyInstance(Hello.class);
        hello.sayHello();
    }

}
class Hello{
    public void sayHello(){
        System.out.println("Hello World!");
    }
}
